Development - #354
Conversation
#339 added studio/video generation modules. --group assigns them to python-a, but test_ci_shards still requires an exact committed partition.
#339 added studio/video generation modules. --group assigns them to python-a, but test_ci_shards still requires an exact committed partition.
Export used Video3D media into a versioned zip, import with preflight and picker repair, and refuse templates, cinema runtimes, zip slip and oversized archives without touching the previous project on failure.
…tory CI cannot install python-multipart; accept the package as a raw zip body. Split preflight helpers so complexity stays under the ratchet, copy bytes before SHA-256 for TypeScript, and record the new scene-package reader.
Split URL/ref/preflight helpers and extract router handlers so no function stays at complexity 15+ and the service stays under 1200 lines.
…shes Export looked up packed hashes with (workspace, filename, url), but slots that only have sourceUrl were rewritten with an empty filename, so the GLB stayed pointed at the source workspace after a "successful" import. Also skip dest names whose .meta.json already belongs to another extension. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
…0 lines The ratchet treats a new 1,253-line module as a hotspot. Move import, reassignment and unique-name helpers to scene_packages_import.py.
Read Activity as request → child jobs → attempts → artifacts. Group by existing intent/receipt IDs, keep selection stable across SSE/polling, and let Wizard receipts open the exact group without a second progress source.
Extract stream, panel, compact bar and execution cards so every function stays at eslint complexity 14 or lower. Refresh the architecture wire inventory for the ActivityFooter store import in tests.
Activity opened details via agentUiBus and mapped targets via executionCards. Both belong to Agent Mode; listen through uiBus and keep the tab map local so the slice-import contract stays empty.
Add a cue timeline for source-time viseme edits and interval reanalysis, and hash stored GLBs with a workspace SHA-256 so face profiles still save on HTTP LAN without crypto.subtle.
Extract track, tools and cue fields so no function exceeds complexity 14, and call reanalyze only after an explicit selection/handler guard.
CueTimeline reused the Listen aria-label and the GLB digest route was unhandled after boot. Give playback its own copy and stub /character-kits/speech/digest in the simulated API.
Añade explosion como SFX de mundo (destello, bola de fuego, onda, escombros y humo tardío) y sustituye el pintor 2D genérico. Plantilla Cinema · Ground blast.
Add an EN/ES fixture covering intents, negations, ambiguous refs, workspace change, retry identity, compound orders and unpublished tools. Contract tests prove refusals create no task, unpublished generation.video cannot promise success, and HTTP/MCP retries share one job id. Guide is for operators who do not know the code.
#339 published generation.video. The corpus now rejects generation.model3d instead, and the Wizard refusal E2E accepts the current exclusion copy.
…20260911 feat(projects): portable scene packages with asset repair
fix(video3d): conservar el media de pantallas al aplicar un escenario
…9-5886e5916a46-7f81 fix(ui): restaurar Settings y Director fuera de Generación directa
…e-20260911 feat(activity): group jobs under request with receipts and recovery
A hard cut before xfade left concat's 1/1000000 timebase on the left input, so FFmpeg rejected cut-then-crossfade and time-card-then-xfade exports. Reset settb/setpts on both xfade inputs. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
Pin multi_prompts_gen_type=2 so newline prompts are not split by primary_settings, and pin sliding_window_size to video_length so t2v jobs longer than 129 frames are not skipped-then-marked-done. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
… video Director hold-crossfade still failed when two 30fps clips had different encoder timebases (1/30 vs 1/15360), so the soft join fell back to a slap-cut. Normalize settb=AVTB before tpad/xfade. Hard concat with a driving song mapped the raw audio and used -shortest, so a track shorter than the clips discarded the tail of the movie. Pad and bound the soundtrack so -shortest cannot cut pictures. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
#343 already owns concat 1/fps. Keep the T2V single-window pin, literal multi-line prompts, mix_concat settb, and soundtrack padding.
Director music_video and rejoin pass audio_start_sec as atrim=start on the track (often 12.5). The pad_audio=False bound subtracted that offset from the clip sum, so -shortest discarded the tail of the movie. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
El overlay 2D deja de pintar círculos y palitos. El blast 3D usa lenguas de fuego, anillo irregular y recorte de plano. La plantilla 3D ya no superpone el overlay 2D.
fix(review): keep notes when restating a stale approval
…60913 feat(studio): contextual Series production and reusable phonetic character rigs
Saving a new character used readSpeechDraft(workspace, ''), which aliases the unscoped workshop recovery key. That could overwrite another kit with the new name/voice and wipe the general workshop draft. #414 landed on the Series production branch after it had already merged into development, so the same hole was still on origin/development. Co-authored-by: ignaciodelcano+dcl <ignaciodelcano+dcl@gmail.com>
feat(ui): in-app Help tutorial (ES/EN)
fix(characters): do not treat empty kit id as the general speech draft
Require nine mouth poses and preserve lipsync through export
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Scene save omits workspace URL
- POST /api/v1/scenes now appends ?workspace= to the returned file URL so serve_file looks in the same folder the scene was written to.
Or push these changes by commenting:
@cursor push 10a6914923
Preview (10a6914923)
diff --git a/app/core_runtime.py b/app/core_runtime.py
--- a/app/core_runtime.py
+++ b/app/core_runtime.py
@@ -522,7 +522,8 @@
scene = body.get("scene") if isinstance(body, dict) else None
if not isinstance(scene, dict):
raise HTTPException(status_code=400, detail="A version 1 scene is required")
- folder = core.workspace_dir(body.get("workspace") if isinstance(body, dict) else None)
+ workspace = body.get("workspace") if isinstance(body, dict) else None
+ folder = core.workspace_dir(workspace)
os.makedirs(folder, exist_ok=True)
import json
import time
@@ -532,7 +533,8 @@
Path_write = path
with open(Path_write, "w", encoding="utf-8") as handle:
json.dump(scene, handle)
- return {"name": name, "type": "scene", "url": f"/api/v1/file/{name}"}
+ suffix = f"?workspace={workspace}" if workspace else ""
+ return {"name": name, "type": "scene", "url": f"/api/v1/file/{name}{suffix}"}
@api.post("/api/v1/video-editor/probe")You can send follow-ups to the cloud agent here.
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.
| Path_write = path | ||
| with open(Path_write, "w", encoding="utf-8") as handle: | ||
| json.dump(scene, handle) | ||
| return {"name": name, "type": "scene", "url": f"/api/v1/file/{name}"} |
There was a problem hiding this comment.
Scene save omits workspace URL
Medium Severity
save_scene writes the document into the requested workspace but returns /api/v1/file/{name} with no workspace query. serve_file then resolves the file against the active or default folder, so a scene saved outside that folder is not reachable from the returned URL.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.
| ``` | ||
|
|
||
| Cache dir: `SPEECH_ANALYSIS_CACHE_DIR` or `cache/speech-analysis/` (gitignored). | ||
| Limits: `SPEECH_ANALYSIS_CACHE_MAX_BYTES` (128 MiB), `SPEECH_ANALYSIS_CACHE_MAX_ENTRIES` (64). |
There was a problem hiding this comment.
Agent handoff files committed
Low Severity
Temporary agent notes were added at the repo root, including local machine paths, “do not merge” instructions, and a pending launch-runtime patch. These are working artifacts, not product documentation, and can be mistaken for apply-ready integration steps.
Additional Locations (2)
Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.
Fix release CI ratchet and Bugbot integration findings



Resumen ejecutivo
Qué cambia
Para qué sirve
Impacto para el usuario
Riesgo
Estado
Summary
Overview
Detailed changes
Backend
UI and Wizard
Data, provenance and compatibility
Files and ownership
Validation
Date (UTC):
Base SHA:
Head SHA:
Validation scope: focused / fast / CI-equivalent (
--full) / real smokepython scripts/verify_clean_repo.pypython -m compileall -q app/services app/launch.py scriptsFocused Python tests:
cd ui && npm run i18n:checkUI tests:
cd ui && npm run lint -- --max-warnings=0cd ui && npm run buildgit diff --checkE2E/smoke checks:
Code quality
main: pending CICI and review
Mutable CI/Cursor facts belong in this PR body. Updating them does not
require a new documentary commit. Stable behavior evidence belongs in docs.
Cursor/Bugbot — pick exactly one. A review of an older SHA does not cover a
new HEAD. Silence is not approval. If required QA is missing, use another
authorized agent or leave pending; do not assume a human code review will
substitute.
Coste de la tarea
Notes and limitations
Follow-up work
Checklist
marked as waiting for them.
Note
High Risk
Changes span
_launch_runtimeSeries render gating, a new macOS server profile with divergent MCP/capability behavior, and CI test sharding that could miss tests if grouping drifts.Overview
This is a broad integration pass across CI, platform profiles, Series Lab production, Wizard/MCP, and character speech assets.
CI splits the former monolithic Python test job into two parallel shards driven by
select_local_tests.py, pins installs toscripts/ci-python-*.txt, adds pip and apt (.deb) caching for ffmpeg, and wires both shards intoci-required. The lightweight guard job drops to a 10-minute timeout and no longer runs the full pytest suite.macOS Apple Silicon now boots
core_runtimeinstead of the full Torch/WanGP stack:launch.pydetects the profile and serves editors, labs, remote MiniMax/Meshy flows, and capability-gated stubs for local GPU engines. Companion routers add core labs (Story/Character Kit/Series FS APIs), core MCP (read tools; local mutations 409), core remote (production profile, music/3D jobs, Director planning reads), and series plan jobs on core.On the full runtime, Series asset import dedupes generated references and delegates attachment to
series_production; newreferences/refreshsyncs episode refs. Bulk render start only queues shots whose production method isgenerated_video, with clearer errors for animation/import shots. Audio analysis can derive song structure from an aligned lyric timeline before LLM hints. Director review persists via a new router; scene packages export/import/preflight; system capabilities and user diagnostics HTTP surfaces mount; Wizard workflow executor and World3D export join MCP command catalogs.Character kits expand the mouth manifest to nine viseme states and ship the Studio 20 collection (20 styles). 3D speech accepts JSON+wav analysis requests; face calibration can hash workspace GLBs for profile identity. LLM listing accepts an optional remote url; generate can use scoped writingProvider without loading the default local model.
Docs/handoff files (
README,API.md, lane handoffs, integration patches) document MCP, Series mixed production, Tools commands, and pending merges—without replacing the product changes above.Reviewed by Cursor Bugbot for commit 65dfca3. Configure here.